/**
 * @file StrFunc.h
 * @author 严一涵 (yyhhenry@foxmail.com)
 * @brief 字符串操作
 * @version 0.1
 * @date 2022-05-11
 *
 * @copyright Copyright (c) 2022
 *
 */
#ifndef STRFUNC_H_YYH
#define STRFUNC_H_YYH
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "ListType.h"

/**
 * @brief 字符串复制
 * @author 严一涵
 * @param str 借用所有权，不进行修改
 */
char *Str_clone(const char *str);

/**
 * @brief 拼接两个实例字符串
 * @author 严一涵
 * @param str1 要拼接的串，借用所有权，不进行修改
 * @param str2 要拼接的串，借用所有权，不进行修改
 */
char *Str_add(const char *str1, const char *str2);

/**
 * @brief 拼接两个即时字符串
 * @author 严一涵
 * @param str1 销毁所有权，禁止外部使用
 * @param str2 销毁所有权，禁止外部使用
 */
char *Str_addFree(char *str1, char *str2);

/**
 * @brief 切分实例字符串
 * @author 严一涵
 * @param origin 原始串，对于双引号以内的部分不进行模式匹配
 * @param pattern 模式串（尽量短）
 * @param keepQuotationMarks 保留引号转义结构
 * @return ListType* 一个char*链表结构
 */
ListType *Str_split(const char *origin, const char *pattern, int keepQuotationMarks);

/**
 * @brief 链表对字符串的支持
 * @author 严一涵
 */
char *Str_ListNode(ListNode *p);

/**
 * @brief 字符串以CSV格式转义
 * @author 严一涵
 * @param origin 原始串，借用所有权
 * @return char* 新字符串
 */
char *Str_CSVMode(const char *origin);

/**
 * @brief 字符串以CSV格式转义
 * @author 严一涵
 * @param origin 原始串，销毁所有权
 * @return char* 新字符串
 */
char *Str_CSVModeFree(char *origin);

/**
 * @brief 字符串链表拼接为单个字符串
 * @author 严一涵
 * @param list 字符串链表，借用所有权，不修改
 * @param split 拼接时的分隔符，借用所有权
 * @return char* 拼接的字符串
 */
char *Str_join(ListType *list, const char *split);

/**
 * @brief 文件存入字符串
 * @author 严一涵
 * @param filename 借用所有权，不修改
 * @return char* 全文字符串
 */
char *Str_fromFile(const char *filename);

/**
 * @brief 字符串存入文件
 * @author 严一涵
 * @param filename 借用所有权，不修改
 */
void Str_toFile(const char *str, const char *filename);

/**
 * @brief 字符串转double
 * @author 严一涵
 * @param str 借用所有权，不修改
 */
double Str_parseDouble(const char *str);

/**
 * @brief 字符串转double
 * @author 严一涵
 * @param str 销毁所有权
 */
double Str_parseDoubleFree(char *str);

/**
 * @brief 字符串转int
 * @author 严一涵
 * @param str 借用所有权，不修改
 */
int Str_parseInt(const char *str);

/**
 * @brief 字符串转int
 * @author 严一涵
 * @param str 销毁所有权
 */
int Str_parseIntFree(char *str);

/**
 * @brief double转字符串
 * @author 严一涵
 * @param fixed 保留小数位数
 */
char *Str_fromDouble(double v, int fixed);

/**
 * @brief int转字符串
 * @author 严一涵
 */
char *Str_fromInt(int v);

/**
 * @brief 判断字符串是否全为空白字符
 * @author 严一涵
 */
int Str_isSpace(const char *str);

/**
 * @brief 判断pattern在str中的第一次出现位置，不存在时返回-1（复杂度为O(n^2)不建议大量使用）
 * @author 严一涵
 */
int Str_indexOf(const char *str, const char *pattern);

/**
 * @brief 控制台读入一行字符串
 * @author 严一涵
 */
char *Str_lineFromStdin();

/**
 * @brief 字符串右对齐，左边补ch
 * @author 严一涵
 */
char *Str_rJust(const char *origin, int len, char ch);

/**
 * @brief 字符串右对齐，左边补ch，并销毁原串
 * @author 严一涵
 */
char *Str_rJustFree(char *origin, int len, char ch);
#endif
